用 pyecharts 画出中国疫情地图(附源码)
作者简介:Mort,数据分析爱好者,擅长数据可视化,比较关注机器学习领域,希望能和业内朋友多学习交流。
笔者之前写过两篇绘制地图的文章,分别是用 matplotlib 画出中国疫情地图(附源码)和用 Plotly 画出中国疫情地图(附源码),今天就介绍一下用pyecharts画地图的方法。之前公众号还发过一篇文章叫用 Python 做一个疫情大屏(优化版),写的是用echarts+flask来构建实时动态地图,这是一个很赞的想法,而笔者今天写的pyecharts就是基于echarts。
之前笔者写过Plotly画图的那篇文章中,笔者曾提过plotly是一个基于D3.js的Python库,plotly相当于一个操作层,让用户能用Python的方式操作D3,这对于不会JavaScript的用户是一个很大的便利。而今天介绍的pyecharts和plotly类似,也是用Python的方式来操作echarts,而echarts是和D3类似的一个js图库,其和D3功能上类似,但却是咱们中国人自己开发的(百度开发的),笔者写这篇文章的主要目的之一也是要介绍一下咱们自己的echarts/pyecharts。
下面就介绍一下如何用pyecharts绘制全国疫情地图。刚开始先给大家提个醒,安装pyecharts要用pip install pyecharts命令,目前暂不支持anaconda的conda install命令,笔者用的是anaconda最新版。
首先导入需要的包和准备数据。
from pyecharts import options as opts
from pyecharts.charts import Map
nums = [59989, 1328, 1257, 1172, 1007, 982, 933, 629, 553, 543, 508, 464, 387, 333, 302, 292, 242, 240, 172, 163, 146, 130, 127, 121, 91, 89, 76, 73, 70, 61, 22, 18, 10, 1]
provinces = ['湖北', '广东', '河南', '浙江', '湖南', '安徽', '江西', '江苏', '重庆', '山东', '四川', '黑龙江', '北京', '上海', '河北', '福建', '广西', '陕西', '云南', '海南', '贵州', '山西', '天津', '辽宁', '甘肃', '吉林', '新疆', '内蒙古', '宁夏', '香港', '台湾', '青海', '澳门', '西藏']
sequence = [(a,b) for a,b in zip(provinces,nums)]
这里有3个变量,nums是全国各省确诊人数,provinces是各省名称,sequence是将两者对应起来的一个list。接下来就是绘图部分。
mymap = Map()
mymap.add(series_name='中国最新疫情地图', data_pair=sequence, maptype='china')
mymap.set_global_opts(
visualmap_opts=opts.VisualMapOpts(pieces=[
{"min": 1, "max": 9, "label": "1-9", "color": 'lightcoral'},
{"min": 10, "max": 99, "label": "10-99", "color": 'indianred'},
{"min": 100, "max":999, "label": "100-999", "color": 'brown'},
{"min": 1000, "max": 9999, "label": "1000-9999", "color": 'firebrick'},
{"min": 10000, "max": 60000, "label": "≥10000", "color": 'darkred'}],
is_piecewise=True)
)
mymap.render('render.html')
OK了,是不是so easy。我们可以看到pyecharts和plotly类似,甚至更简单,其自带中国地图数据,不需要额外的地理(坐标)数据,而plotly则需要(上一篇文章中,plotly需要一个json格式的地理文件),当然pyecharts也支持json地理数据,比如本例中我们可以用mymap.add_coordinate_json(‘放入相关数据’)
来读取地理数据。这里有几点要说明一下,首先是地图的变量名不要用map,因为这是Python自带的关键字,容易出错。其次是visualmap_opts=opts.VisualMapOpts(pieces=[...])
这一大堆,在官方文档中并未说明opts.VisualMapOpts
的具体用法,其有很多参数,pieces只是其中之一,这部分用法需要大家认真研究一下,这部分用法我在官方文档中都没搞清楚,还是后来百度一下,才从别人的例子中了解了。最后就是mymap.render('render.html')
会生成一个网页文件,打开这个网页就能看到我们绘制的图片,是交互式的,pyecharts是可以生成静态图片的(具体方法留给大家自己去学习),但生成网页文件可以更好地交互操作。下面把pyecharts绘制的图片和百度官方原图对比一下,两者都是GIF动图。
图1. pyecharts绘制的图片
图2. 百度官方原图
笔者目前已经写了3篇绘制地图的文章了,现在做一个小小的总结吧。我们把每种方法的评价分为好、中、差三个档次,我个人对这3中方法的具体评价如下图。在图中我对pyecharts给了很高的评价,但其官方文档有待改进,因为这个项目目前仅有3个人在维持,希望有热情和时间的开发者能多贡献自己的一份力量,尤其是咱们中国自己的开发项目。
图3. Python的3种绘图方法对比
除了这3种方法,Python还有其他很多好的绘制地图的方法,比如folium、geopandas以及非常出名的bokeh,这些也就留给大家自己去学习吧。最后还是那句话吧,“武汉加油,中国加油!”。
赞 赏 作 者
Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。
扫码关注下方公众号后回复“疫情”即可获取源码数据